<?php
	class gif{
	var $GIF="GIF89a";
	var $VER="1.0";
	var $BUF=Array();
	var $LOP=0;
	var $DIS=2;
	var $COL=-1;
	var $IMG=-1;
	var $ERR=Array('0'=>"GIF动画不能只有一张图片",'1'=>"源文件不是GIF图片",'2'=>"Unintelligibleflag",'3'=>"不能以GIF动画图片再来制作GIF动画");
	//构造函数
	function gif($GIF_src,$GIF_dly,$GIF_lop,$GIF_dis,$GIF_red,$GIF_grn,$GIF_blu,$GIF_mod){
	if(!is_array($GIF_src)&&!is_array($GIF_tim)){exit;}
	$this->LOP=($GIF_lop>-1)?$GIF_lop:0;
	$this->DIS=($GIF_dis>-1)?(($GIF_dis<3)?$GIF_dis:3):2;
	$this->COL=($GIF_red>-1&&$GIF_grn>-1&&$GIF_blu>-1)?($GIF_red|($GIF_grn<<8)|($GIF_blu<<16)):-1;
	for($i=0;$i<count($GIF_src);$i++){
	if(strToLower($GIF_mod)=="url"){$this->BUF[]=fread(fopen($GIF_src[$i],"rb"),filesize($GIF_src[$i]));}
	elseif(strToLower($GIF_mod)=="bin"){$this->BUF[]=$GIF_src[$i];}
	else{exit;}
	if(substr($this->BUF[$i],0,6)!="GIF87a"&&substr($this->BUF[$i],0,6)!="GIF89a"){exit;}
	for($j=(13+3*(2<<(ord($this->BUF[$i]{10})&0x07))),$k=TRUE;$k;$j++){
	switch($this->BUF[$i]{$j}){
	case"!":
	if((substr($this->BUF[$i],($j+3),8))=="NETSCAPE"){exit;}
	break;
	case";":
	$k=FALSE;
	break;
	}
	}
	}
	gif::add_header();
	for($i=0;$i<count($this->BUF);$i++){gif::add_frame($i,$GIF_dly[$i]);}
	gif::add_footer();
	}
	//添加头部
	function add_header(){
	$cmap=0;
	if(ord($this->BUF[0]{10}) & 0x80){
	$cmap=3*(2<<(ord($this->BUF[0]{10}) & 0x07));
	$this->GIF.=substr($this->BUF[0],6,7);
	$this->GIF.=substr($this->BUF[0],13,$cmap);
	$this->GIF.="!\377\13NETSCAPE2.0\3\1".gif::get_word($this->LOP)."\0";
	}
	}
	//添加帧
	function add_frame($i,$d){
	$Locals_str=13+3*(2<<(ord($this->BUF[$i]{10})&0x07));
	$Locals_end=strlen($this->BUF[$i])-$Locals_str-1;
	$Locals_tmp=substr($this->BUF[$i],$Locals_str,$Locals_end);
	$Global_len=2<<(ord($this->BUF[0]{10})&0x07);
	$Locals_len=2<<(ord($this->BUF[$i]{10})&0x07);
	$Global_rgb=substr($this->BUF[0],13,3*(2<<(ord($this->BUF[0]{10})&0x07)));
	$Locals_rgb=substr($this->BUF[$i],13,3*(2<<(ord($this->BUF[$i]{10})&0x07)));
	$Locals_ext="!\xF9\x04".chr(($this->DIS<<2)+0).chr(($d>>0)&0xFF).chr(($d>>8)&0xFF)."\x0\x0";
	if($this->COL>-1&&ord($this->BUF[$i]{10})&0x80){
	for($j=0;$j<(2<<(ord($this->BUF[$i]{10})&0x07));$j++){if(ord($Locals_rgb{3*$j+0})==(($this->COL>>16)&0xFF)&&ord($Locals_rgb{3*$j+1})==(($this->COL>>8)&0xFF)&&ord($Locals_rgb{3*$j+2})==(($this->COL>>0)&0xFF)){$Locals_ext="!\xF9\x04".chr(($this->DIS<<2)+1).chr(($d>>0)&0xFF).chr(($d>>8)&0xFF).chr($j)."\x0";break;}}
	}
	switch($Locals_tmp{0}){
	case"!":
	$Locals_img=substr($Locals_tmp,8,10);
	$Locals_tmp=substr($Locals_tmp,18,strlen($Locals_tmp)-18);
	break;
	case",":
	$Locals_img=substr($Locals_tmp,0,10);
	$Locals_tmp=substr($Locals_tmp,10,strlen($Locals_tmp)-10);
	break;
	}
	if(ord($this->BUF[$i]{10})&0x80&&$this->IMG>-1){
	if($Global_len==$Locals_len){
	if(gif::block_compare($Global_rgb,$Locals_rgb,$Global_len)){$this->GIF.=($Locals_ext.$Locals_img.$Locals_tmp);}
	else{
	$byte=ord($Locals_img{9});
	$byte|=0x80;
	$byte&=0xF8;
	$byte|=(ord($this->BUF[0]{10})&0x07);
	$Locals_img{9}=chr($byte);
	$this->GIF.=($Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp);
	}
	}
	else{
	$byte=ord($Locals_img{9});
	$byte|=0x80;
	$byte&=0xF8;
	$byte|=(ord($this->BUF[$i]{10})&0x07);
	$Locals_img{9}=chr($byte);
	$this->GIF.=($Locals_ext.$Locals_img.$Locals_rgb.$Locals_tmp);
	}
	}
	else{$this->GIF.=($Locals_ext.$Locals_img.$Locals_tmp);}
	$this->IMG=1;
	}
	//添加脚部
	function add_footer(){$this->GIF.=";";}
	//比较
	function block_compare($block,$local_block,$Len){
	for($i=0;$i<$Len;$i++){
	if($block{3*$i+0}!=$local_block{3*$i+0} || $block{3*$i+1}!=$local_block{3*$i+1} || $block{3*$i+2}!=$local_block{3*$i+2}){return (0);}
	}
	return (1);
	}
	//获取值
	function get_word($int){return (chr($int & 0xFF).chr(($int>>8) & 0xFF));}
	//生成gif
	function get_gif(){return ($this->GIF);}
	}
	?>
	<?php
	require_once('gif.php');
	$frames[]='image/1.gif';
	$frames[]='image/2.gif';
	$frames[]='image/3.gif';
	$frames[]='image/4.gif';
	$framed[]=10;//显示时间长度[百分之一秒]
	$framed[]=10;
	$framed[]=10;
	$framed[]=10;
	$gif=new gif($frames,$framed,0,2,255,0,0,"url");
	//第3个参数循环次数[0无限]
	/*第4个参数
	0:不做任何处理直接显示下一帧
	1:不做任何处理直接显示下一帧
	2:在显示下一帧前先用背景色填充画面
	3:在显示下一帧前先把画面恢复为显示当前帧的上一帧
	*/
	//第567个参数指透明色的rgb成分
	//第8个参数表示指向了静态gif文件
	header('content-type:image/gif');
	echo $gif->get_gif();
?>